package org.Ogre.OgreMain;

public abstract class RenderSystem {
	
	/**
	 * Default Constructor
	 */
	public RenderSystem(){}
	
	/**
	 * Returns the name of the rendering system
	 * @return
	 */
	public abstract String getName();
	
	/**
	 * Returns the details of this API's configuration options
	 * 
	 * @remarks Each render system must be able to inform the world 
	 * of what options must/can be specified for it's operation
	 * 
	 * @par These are passed as strings for portability, but grouped 
	 * into a structure (_ConfigOption) which includes both options 
	 * and current value
	 * 
	 * @par Note that the settings returned from this call are affected 
	 * by the options that have been set so far, since some options are 
	 * interdependent
	 * 
	 * @par This routine is called automatically by the default 
	 * configuration dialogue produced by Root::showConfigDialog or may 
	 * be used by the caller for custom settings dialogs
	 * 
	 * @return A 'map' of options, i.e a list of options which is also 
	 * indexed by option name
	 */
	public abstract ConfigOptionMap getConfigOptions();
	
	/**
	 * Sets an option for this API
	 * 
	 * @remarks Used to confirm the settings (normally chosen by the user) in
	 * order to make the renderer able to initialise with the settings ar required.
	 * This may be video mode, full screen / windowed etc.
	 * Called automatically by the default configuration
	 * dialog, and by the restoration of saved settings.
	 * These settings are stored and only activated when
	 * RenderSystem::initialise or RenderSystem::reinitialise
	 * are called.
	 * 
	 *  @par If using a custom configuration dialog, it is advised that the 
	 *  caller calls RenderSystem::getConfig Options
	 *  again, since some options can alter resulting from a selection.
	 *  
	 *  @param name	The name of the option to alter.
	 *  @param value The value to set the option to.
	 */
	public abstract void setConfigOption(String name, String value);
	
	/**
	 * Create an object for performing hardware occlusion queries.
	 */
	public abstract HardwareOcclusionQuery createHardwareOcclusionQuery();
	
	/**
	 * Destroy a hardware occlusion query object.
	 */
	public abstract void destroyHardwareOcclusionQuery(HardwareOcclusionQuery hq);
	
	/**
	 * Validates The options set for the rendering system, returning a message if there 
	 * are problems. 
	 * @note If the returned string is empty, there are no problems.
	 */
	public abstract String validateConfigOptions();
}
